import common from "./BQGIS-modelTool"
/**
 * 几何体种植
 * @param    viewer  Mars3d实例对象
 * @returns 
 */
export function initBQGIS_geometry(viewer = window.viewer){
    return new BQGIS_geometry(viewer)
}
export function BQGIS_geometry(viewer = window.viewer){
    this.viewer = viewer
    // 创建矢量数据图层
    this.graphicLayer = new mars3d.layer.GraphicLayer()
    this.viewer.addLayer(this.graphicLayer)
    this.common=new common()
}
/**
 * 添加几何体
 * @param   type            几何体类型（必填）（对象.type 默认长方体）       
 * @param   id              id（可不传入）
 * @param   name            名称（可不传入）
 * @param   heading         方向角（可不传入）（范围0-360 默认0）
 * @param   pitch           俯仰角（可不传入）（范围0-360 默认0）
 * @param   roll            翻滚角（可不传入）（范围0-360 默认0）
 * @param   color           颜色（可不传入）（默认#ffffff）
 * @param   opacity         透明度（可不传入）（范围0-1 默认1）
 * @param   outline         边框（可不传入）（默认false）
 * @param   outlineWidth    边框宽度（可不传入）（默认2）
 * @param   outlineColor    边框颜色（可不传入）（默认#ffffff）
 * @param   heightReference 地形位置（可不传入）（默认NONE）
 * @param   isSave          是否保存到数据库（可不传入）（默认fasle）
 * 长方体参数
 * @param   dimensions_x    长（可不传入）（默认100）
 * @param   dimensions_y    宽（可不传入）（默认100）
 * @param   dimensions_z    搞（可不传入）（默认100）
 * 圆参数
 * @param   radius          半径（可不传入）（默认100）
 * 圆高度
 * @param   height          圆高度（可不传入）（ 默认10）
 * 圆或椭圆参数
 * @param   radii_x         x方向半径（可不传入）（默认100）
 * @param   radii_y         y方向半径（可不传入）（默认100）
 * @param   radii_z         z方向半径（可不传入）（默认100）
 * 圆锥参数
 * @param   bottomRadius    圆锥半径（可不传入）（默认100）
 * @param   length          圆锥高（可不传入）（ 默认100）
 */
BQGIS_geometry.prototype.addGeometry=function(option={}){
    let param= Object.assign({
        type:this.type.长方体,
        //公共属性
        id:this.common.guid(),
        name:'多面体',  
        heading:0,//方向角
        pitch:0, //俯仰角
        roll:0,//翻滚角
        color:'#ffffff',//颜色
        opacity:1 ,//透明度
        outline:false,//是否边框
        outlineWidth:2,//边框宽度
        outlineColor:'#000000',//边框颜色
        heightReference:'NONE',//地形位置
        isSave:false,
        //长方体
        dimensions_x:100,//长
        dimensions_y:100,//宽
        dimensions_z:100,//高
        //圆的半径
        radius:100,//半径
        //圆柱      
        height:10,//高
        //椭圆
        radii_x:100,//x半径
        radii_y:100,//y半径
        radii_z:100,//z半径       
        //圆锥
        bottomRadius:100,//圆锥半径
        length:100,//圆锥高
        position:[]
    },option)
    let graphic;
    switch (param.type) {    
        case 'box':
            graphic=new mars3d.graphic.BoxEntity({
                position:param.position,
                id:param.id,
                name:param.name,
                style:{
                    dimensions_x:param.dimensions_x,
                    dimensions_y:param.dimensions_y,
                    dimensions_z:param.dimensions_z,
                    heading:param.heading,
                    pitch:param.pitch,
                    roll:param.roll,
                    color:param.color,
                    opacity:param.opacity,
                    outline:param.outline,
                    outlineWidth:param.outlineWidth,
                    outlineColor:param.outlineColor,
                    heightReference:this.common.switchHeightReference(param.heightReference)
                }
            })        
            break;
        case 'circle':
             graphic=new mars3d.graphic.CircleEntity({
                position:param.position,
                id:param.id,
                name:param.name,
                style:{
                    heading:param.heading,
                    pitch:param.pitch,
                    roll:param.roll,
                    color:param.color,
                    opacity:param.opacity,
                    outline:param.outline,
                    outlineWidth:param.outlineWidth,
                    outlineColor:param.outlineColor,
                    heightReference:this.common.switchHeightReference(param.heightReference),

                    radius:100,//半径
                    height:10,//高
                }
            })           
            break;
        case 'ellipse':
            graphic=new mars3d.graphic.EllipsoidEntity({
                position:param.position,
                id:param.id,
                name:param.name,
                style:{
                    heading:param.heading,
                    pitch:param.pitch,
                    roll:param.roll,
                    color:param.color,
                    opacity:param.opacity,
                    outline:param.outline,
                    outlineWidth:param.outlineWidth,
                    outlineColor:param.outlineColor,
                    heightReference:this.common.switchHeightReference(param.heightReference),

                    radii_x:param.radii_x,
                    radii_y:param.radii_y,
                    radii_z:param.radii_z,    
                }
            }) 
            break
        case 'ellipsoid':
            graphic=new mars3d.graphic.EllipsoidEntity({
                position:param.position,
                id:param.id,
                name:param.name,
                style:{
                    heading:param.heading,
                    pitch:param.pitch,
                    roll:param.roll,
                    color:param.color,
                    opacity:param.opacity,
                    outline:param.outline,
                    outlineWidth:param.outlineWidth,
                    outlineColor:param.outlineColor,
                    heightReference:this.common.switchHeightReference(param.heightReference),

                    radii_x:param.radius,
                    radii_y:param.radius,
                    radii_z:param.radius,    
                }
            }) 
            break
        case 'cylinder':
            graphic=new mars3d.graphic.CylinderEntity({
                position:param.position,
                id:param.id,
                name:param.name,
                style:{
                    heading:param.heading,
                    pitch:param.pitch,
                    roll:param.roll,
                    color:param.color,
                    opacity:param.opacity,
                    outline:param.outline,
                    outlineWidth:param.outlineWidth,
                    outlineColor:param.outlineColor,
                    heightReference:this.common.switchHeightReference(param.heightReference),

                    bottomRadius:bottomRadius,
                    length:param.length   
                }
            }) 
            break
        default:
            break;
    }
    this.graphicLayer.addGraphic(graphic) 
    if(param.isSave){
        //let style=this.getStyle(param)
        //param.position = style.position
        if(param.type==="ellipsoid"){
            style.radius=param.radius
        }
        this.common.saveSymbolAttribute({id:param.id, type:'geometry',typeName:'几何体',attribute:JSON.stringify(param)},true)
    }
    return param.id
}
/**
 * 更新几何体
 * @param   type            几何体类型（必填）（对象.type 默认长方体）       
 * @param   id              id（可不传入）
 * @param   name            名称（可不传入）
 * @param   heading         方向角（可不传入）（范围0-360 默认0）
 * @param   pitch           俯仰角（可不传入）（范围0-360 默认0）
 * @param   roll            翻滚角（可不传入）（范围0-360 默认0）
 * @param   color           颜色（可不传入）（默认#ffffff）
 * @param   opacity         透明度（可不传入）（范围0-1 默认1）
 * @param   outline         边框（可不传入）（默认false）
 * @param   outlineWidth    边框宽度（可不传入）（默认2）
 * @param   outlineColor    边框颜色（可不传入）（默认#ffffff）
 * @param   heightReference 地形位置（可不传入）（默认NONE）
 * @param   isSave          是否保存到数据库（可不传入）（默认fasle）
 * 长方体参数
 * @param   dimensions_x    长（可不传入）（默认100）
 * @param   dimensions_y    宽（可不传入）（默认100）
 * @param   dimensions_z    搞（可不传入）（默认100）
 * 圆参数
 * @param   radius          半径（可不传入）（默认100）
 * 圆高度
 * @param   height          圆高度（可不传入）（ 默认10）
 * 圆或椭圆参数
 * @param   radii_x         x方向半径（可不传入）（默认100）
 * @param   radii_y         y方向半径（可不传入）（默认100）
 * @param   radii_z         z方向半径（可不传入）（默认100）
 * 圆锥参数
 * @param   bottomRadius    圆锥半径（可不传入）（默认100）
 * @param   length          圆锥高（可不传入）（ 默认100）
 */
BQGIS_geometry.prototype.updateGeometry=function(option={}){
    let data= this.graphicLayer.getGraphicById(option.id)
    if(data){
        data.setStyle(option)
        if(option.isSave){
            let arrtdata= this.common.getSymbolAttributeById(option.id)
            if(arrtdata){
                let temp = JSON.parse( arrtdata.attribute)
                let attr=Object.assign(temp,data.style)
                this.common.saveSymbolAttribute({id:data.id, type:'model',typeName:'模型',attribute:JSON.stringify(attr)},false)
            }
            
        }
    }
}
/**
 * 根据id清除几何体
 */
BQGIS_geometry.prototype.removeGeometry=function(id){
    let data= this.graphicLayer.getGraphicById(id)
    if(data){
        this.graphicLayer.removeGraphic(data)
    }
}
/**
 * 清除所有几何体
 */
BQGIS_geometry.prototype.clearGeometry=function(){
    this.graphicLayer.clear()
}
/**
 * 添加几何体
 * @param   type            几何体类型（必填）（对象.type 默认长方体）       
 * @param   id              id（可不传入）
 * @param   name            名称（可不传入）
 * @param   heading         方向角（可不传入）（范围0-360 默认0）
 * @param   pitch           俯仰角（可不传入）（范围0-360 默认0）
 * @param   roll            翻滚角（可不传入）（范围0-360 默认0）
 * @param   color           颜色（可不传入）（默认#ffffff）
 * @param   opacity         透明度（可不传入）（范围0-1 默认1）
 * @param   outline         边框（可不传入）（默认false）
 * @param   outlineWidth    边框宽度（可不传入）（默认2）
 * @param   outlineColor    边框颜色（可不传入）（默认#ffffff）
 * @param   heightReference 地形位置（可不传入）（默认NONE）
 * @param   isSave          是否保存到数据库（可不传入）（默认fasle）
 * 长方体参数
 * @param   dimensions_x    长（可不传入）（默认100）
 * @param   dimensions_y    宽（可不传入）（默认100）
 * @param   dimensions_z    搞（可不传入）（默认100）
 * 圆参数
 * @param   radius          半径（可不传入）（默认100）
 * 圆高度
 * @param   height          圆高度（可不传入）（ 默认10）
 * 圆或椭圆参数
 * @param   radii_x         x方向半径（可不传入）（默认100）
 * @param   radii_y         y方向半径（可不传入）（默认100）
 * @param   radii_z         z方向半径（可不传入）（默认100）
 * 圆锥参数
 * @param   bottomRadius    圆锥半径（可不传入）（默认100）
 * @param   length          圆锥高（可不传入）（ 默认100）
 */
BQGIS_geometry.prototype.draw=function(option={}){
    let param= Object.assign({
        type:this.type.长方体,
        //公共属性
        id:this.common.guid(),
        name:'多面体',  
        heading:0,//方向角
        pitch:0, //俯仰角
        roll:0,//翻滚角
        color:'#ffffff',//颜色
        opacity:1 ,//透明度
        outline:false,//是否边框
        outlineWidth:2,//边框宽度
        outlineColor:'#000000',//边框颜色
        heightReference:'NONE',//地形位置
        isSave:false,
        //长方体
        dimensions_x:100,//长
        dimensions_y:100,//宽
        dimensions_z:100,//高
        //圆的半径
        radius:100,//半径
        //圆柱      
        height:10,//高
        //椭圆
        radii_x:100,//x半径
        radii_y:100,//y半径
        radii_z:100,//z半径       
        //圆锥
        bottomRadius:100,//圆锥半径
        length:100,//圆锥高
        position:[]//位置信息
    },option)
    let style=this.getStyle(param)
    this.graphicLayer.startDraw({
        type:param.type==="ellipse"?"ellipsoid":param.type,
        style:style,
        success:graphic=>{
            if(param.isSave){
                style.position=[graphic.point.lng,graphic.point.lat,graphic.point.alt]//common.getLngLat(graphic.position.getValue())
                if(param.type==="ellipsoid"){
                    style.radius=param.radius
                }
                this.common.saveSymbolAttribute({id:param.id, type:'geometry',typeName:'几何体',attribute:JSON.stringify(param)},true)
            }           
        }
    })
    return param.id
}
BQGIS_geometry.prototype.getStyle=function(param){
    let ret;
    switch (param.type) {
        case 'box':
            ret={
                id:param.id,
                name:param.name,
                dimensions_x:param.dimensions_x,
                dimensions_y:param.dimensions_y,
                dimensions_z:param.dimensions_z,
                heading:param.heading,
                pitch:param.pitch,
                roll:param.roll,
                color:param.color,
                opacity:param.opacity,
                outline:param.outline,
                outlineWidth:param.outlineWidth,
                outlineColor:param.outlineColor,
                heightReference:this.common.switchHeightReference(param.heightReference),
            }
            break;
        case 'circle':
            ret={
                id:param.id,
                name:param.name,
                heading:param.heading,
                pitch:param.pitch,
                roll:param.roll,
                color:param.color,
                opacity:param.opacity,
                outline:param.outline,
                outlineWidth:param.outlineWidth,
                outlineColor:param.outlineColor,
                heightReference:this.common.switchHeightReference(param.heightReference),
                radius:100,//半径
                height:10,//高
            }
            break;
        case 'ellipse':
            ret={
                id:param.id,
                name:param.name,
                heading:param.heading,
                pitch:param.pitch,
                roll:param.roll,
                color:param.color,
                opacity:param.opacity,
                outline:param.outline,
                outlineWidth:param.outlineWidth,
                outlineColor:param.outlineColor,
                heightReference:this.common.switchHeightReference(param.heightReference),
                radii_x:param.radii_x,
                radii_y:param.radii_y,
                radii_z:param.radii_z,

            }
            break;
        case 'cylinder':
            ret={
                id:param.id,
                name:param.name,
                heading:param.heading,
                pitch:param.pitch,
                roll:param.roll,
                color:param.color,
                opacity:param.opacity,
                outline:param.outline,
                outlineWidth:param.outlineWidth,
                outlineColor:param.outlineColor,
                heightReference:this.common.switchHeightReference(param.heightReference),

                bottomRadius:bottomRadius,
                length:param.length
            }
            break;
        case 'ellipsoid':
            ret={
                id:param.id,
                name:param.name,
                heading:param.heading,
                pitch:param.pitch,
                roll:param.roll,
                color:param.color,
                opacity:param.opacity,
                outline:param.outline,
                outlineWidth:param.outlineWidth,
                outlineColor:param.outlineColor,
                heightReference:this.common.switchHeightReference(param.heightReference),

                radii_x:param.radius,
                radii_y:param.radius,
                radii_z:param.radius,
            }
             break;
        default:
            break;
    }
    return ret;
}
BQGIS_geometry.prototype.type={
    长方体:"box",
    圆柱:"circle",
    椭圆:"ellipse",
    圆锥:"cylinder",
    球:"ellipsoid"
}
BQGIS_geometry.prototype.heightReferenceOptions=function(){
    return this.common.seat
} 